<?php

require_once(BaseConfig::LoadClass('load_file.class.php'     ));
$intGERR = error_reporting();
error_reporting(0);
require_once(BaseConfig::LoadClass('contrib/excel/reader.php'));
error_reporting($intGERR);

class LoadXLS extends LoadFile {
  var $xlsArchivo            ;
  var $intPrimerFila         ;
  var $bolManejarPaginasTodas;
  var $intPaginaActual       ;
  var $intColActual          ;
  var $arrInfoExtra          ;
  var $__arrInfoExtraAct     ;
  var $bolLetCellsInfoAlone  ;

  
  /**
   * Diccionario de datos para convertir las llaves en datos
   * 
   * @var array
   */
  var $__arrDiccionario      ;

  /**
   *
   * @param String  $strArchivoFuente                Nombre del archivo fuente a utilizar
   * @param Array   $arrTiposChequeo                 Arreglo con el tipo de cada columna para checar que sea valida.
   * @param int     $intCantidadColumnas             Numero de columnas que contendrá el archivo.
   * @param Array   $arrSaltarSiExistenEnPrimeraFila Arreglo que contiene los datos que se checarán en la primera columna. Si el valor de una linea en la primer columna contiene alguno de estos datos, se saltará y no será tomado en cuenta.
   * @param int     $intPrimerFila                   Numero de fila inicial (Por default 0, o la primera)
   * @param Boolean $bolManejarPaginasTodas          True si se manejarán todas las hojas del documento en excel
   */
  function Init($strArchivoFuente, $arrTiposChequeo, $intCantidadColumnas, $arrSaltarSiExistenEnPrimeraFila = "", $intPrimerFila = 0, $bolManejarPaginasTodas = false) {
    $this->intPrimerFila          = $intPrimerFila;
    $this->bolManejarPaginasTodas = $bolManejarPaginasTodas;
    $this->intPaginaActual        = 0;
    $this->__arrDiccionario       = array();
    $this->arrInfoExtra           = array();
    $this->__arrInfoExtraAct      = array();

    parent::__ArmarDatosPrivados($strArchivoFuente, $arrTiposChequeo, $intCantidadColumnas, $arrSaltarSiExistenEnPrimeraFila);
  }
  
  function InitDiccionario($arrInfoDiccionario, $arrInfoCarga) {
    if(is_array($arrInfoDiccionario)) {
      foreach($arrInfoDiccionario as $strNombreIndice => $arrInfoIndice) {
        // Se lee con el indice en Desc y la descripcion en indice para que sea más sencillo hacer la asociacion de datos
        $arrInfoTmp = Variables::GetArrayByTable($arrInfoIndice["tabla"]["nombre"], $arrInfoIndice["tabla"]["desc"], $arrInfoIndice["tabla"]["indice"]);
        foreach($arrInfoCarga as $intIndice => $strNombre) {
          if($strNombreIndice == $strNombre) {
            $this->__arrDiccionario[$intIndice] = $arrInfoTmp;
          }
        }
      }
    }
  }
  
  function __AbrirArchivo() {
    $this->xlsArchivo = new Spreadsheet_Excel_Reader();
    $this->xlsArchivo->setOutputEncoding('CP1251');
    $this->xlsArchivo->read($this->strArchivoFuente);

    $this->intIndiceActual = $this->intPrimerFila;
    $this->intColActual    = $this->intPrimerFila;
    
    // Quitar datos innecesarios
//    unset($this->xlsArchivo->boundsheets     );
    unset($this->xlsArchivo->formatRecords   );
    unset($this->xlsArchivo->sst             );    unset($this->xlsArchivo->data            );
    unset($this->xlsArchivo->_ole            );    unset($this->xlsArchivo->_defaultEncoding);
    unset($this->xlsArchivo->_defaultFormat  );    unset($this->xlsArchivo->_columnsFormat  );
    unset($this->xlsArchivo->_rowoffset      );    unset($this->xlsArchivo->_coloffset      );
    unset($this->xlsArchivo->dateFormats     );    unset($this->xlsArchivo->numberFormats   );
    unset($this->xlsArchivo->_encoderFunction);    unset($this->xlsArchivo->nineteenFour    );
    unset($this->xlsArchivo->sn              );    unset($this->xlsArchivo->multiplier      );
    unset($this->xlsArchivo->curformat       );
    if($this->bolLetCellsInfoAlone) {
      
    } else {
      foreach($this->xlsArchivo->sheets as $intPag => $arrInfoPag) {
        unset($this->xlsArchivo->sheets[$intPag]["cellsInfo"]);
      }
    }
    
    if($this->xlsArchivo->sheets[0]['numRows'] > $this->intIndiceActual) {
      $this->EOF = false;
    } else {
      $this->EOF = true;
    }
  }
  
  /**
   *  Chequeo para ver si esta linea está vacia
   */
  function __ChecarLineaVacia() {
    $bolVacio = 1;
    for($ijk = 2; $ijk <= $this->intCantidadColumnas; $ijk++) {
      if(@Variables::DeepTrim($this->xlsArchivo->sheets[$this->intPaginaActual]['cells'][$this->intColActual + 1][$ijk])) {
        $bolVacio = 0;
        break;
      }
    }
    
    return $bolVacio;
  }

  function __ObtenerSiguienteLinea() {
    if($this->bolManejarPaginasTodas) {
      if($this->intColActual >= $this->xlsArchivo->sheets[$this->intPaginaActual]['numRows']) {
        $this->intPaginaActual++;
        if(!isset($this->xlsArchivo->sheets[$this->intPaginaActual])) {
          $this->EOF = true;
          return;
        } else {
          $this->intColActual = $this->intPrimerFila;
        }
      }
    } else {
      if($this->intIndiceActual >= $this->xlsArchivo->sheets[$this->intPaginaActual]['numRows']) {
        $this->EOF = true;
        return;
      }
    }

    $bolVacio = $this->__ChecarLineaVacia();
    // Si la linea esta vacia, se necesita obtener la siguiente
    if($bolVacio) {
      $this->intIndiceActual++;
      $this->intColActual++;
      return $this->__ObtenerSiguienteLinea();
    }

    $arrRet = array();

    for($i = 1; $i <= $this->xlsArchivo->sheets[$this->intPaginaActual]['numCols']; $i++) {
      if(@$this->xlsArchivo->sheets[$this->intPaginaActual]['cellsInfo'][$this->intIndiceActual + 1][$i]["type"] == "date") {
        $arrRet[] = date("Y-m-d H:i:s",  $this->xlsArchivo->sheets[$this->intPaginaActual]['cellsInfo'][$this->intColActual + 1][$i]["raw"]);
      } else {
        $arrRet[] = @Variables::DeepTrim($this->xlsArchivo->sheets[$this->intPaginaActual]['cells'][$this->intColActual + 1][$i]);
      }
    }
    
    $this->__arrInfoExtraAct["nombre_sheet"] = $this->xlsArchivo->boundsheets[$this->intPaginaActual]["name"];
    
    $this->__arrLineaActual = $arrRet;
    $this->intIndiceActual++;
    $this->intColActual++;
    
    $this->CambiarValoresDiccionario();
  }
  
  function CambiarValoresDiccionario() {
    foreach($this->__arrDiccionario as $intColumna => $arrInfoColumna) {
      if(!isset($arrInfoColumna[$this->__arrLineaActual[$intColumna]])) {
        $this->__arrErroresCarga[] = "Linea {$this->intIndiceActual}: No se encuentra la entrada del diccionario [$intColumna] para la clave [{$this->__arrLineaActual[$intColumna]}]";
      } else {
        $this->__arrLineaActual[$intColumna] = $arrInfoColumna[$this->__arrLineaActual[$intColumna]];
      }
    }
  }
}

?>